package com.archgeek.java.conc.thread;

/**
 * @author pizhihui
 * @date 2023-04-20 18:16
 */
public class ThreadJoinTest {


    /*
    * 首先join() 是一个synchronized方法， 里面调用了wait()，这个过程的目的是让持有这个同步锁的线程进入等待，那么谁持有了这个同步锁呢？
    * 答案是主线程，因为主线程调用了threadA.join()方法，相当于在threadA.join()代码这块写了一个同步代码块，谁去执行了这段代码呢，是主线程，所以主线程被wait()了。
    * 然后在子线程threadA执行完毕之后，JVM会调用lock.notify_all(thread);唤醒持有threadA这个对象锁的线程，也就是主线程，会继续执行。
    *
    * 1. 这部分验证的主要体现就是加了 thread.join() 后，会影响到输出结果。如果不加，main end！ 会优先 thread after 提前打印出来。
    * 2. join() 是一个 synchronized 方法，里面调用了 wait() 方法，让持有当前同步锁的线程进入等待状态，也就是主线程。当子线程执行完毕后，
    *    我们从源码中可以看到 JVM 调用了 lock.notify_all(thread) 所以唤醒了主线程继续执行。
    *
    * */

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
            System.out.println("thread before");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("thread after");
        });
        thread.start();
        System.out.println("main begin");
        thread.join();
        System.out.println("main end!");
    }

}
